home *** CD-ROM | disk | FTP | other *** search
/ QRZ! Ham Radio 4 / QRZ Ham Radio Callsign Database - Volume 4.iso / files / dsp / 56ktools / dspkgctr.z / dspkgctr / gcc / config / tm-encore.h < prev    next >
C/C++ Source or Header  |  1992-06-08  |  6KB  |  199 lines

  1. /* Definitions of target machine for GNU compiler.  ENCORE NS32000 version.
  2.    Copyright (C) 1988 Free Software Foundation, Inc.
  3.    Adapted by Robert Brown (brown@harvard.harvard.edu) from the Sequent
  4.      version by Michael Tiemann (tiemann@mcc.com).
  5.  
  6. This file is part of GNU CC.
  7.  
  8. GNU CC is free software; you can redistribute it and/or modify
  9. it under the terms of the GNU General Public License as published by
  10. the Free Software Foundation; either version 1, or (at your option)
  11. any later version.
  12.  
  13. GNU CC is distributed in the hope that it will be useful,
  14. but WITHOUT ANY WARRANTY; without even the implied warranty of
  15. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
  16. GNU General Public License for more details.
  17.  
  18. You should have received a copy of the GNU General Public License
  19. along with GNU CC; see the file COPYING.  If not, write to
  20. the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.  */
  21.  
  22.  
  23. /*
  24.  *  Looks like all multiprocessors have this bug!
  25.  */
  26.  
  27. #define SEQUENT_ADDRESS_BUG 1
  28.  
  29. #include "tm-ns32k.h"
  30.  
  31. #define SDB_DEBUGGING_INFO
  32. #undef DBX_REGISTER_NUMBER
  33. #define DBX_REGISTER_NUMBER(REGNO) (REGNO)
  34.  
  35. /* Cause long-jump assembler to be used,
  36.    since otherwise some files fail to be assembled right.  */
  37. #define ASM_SPEC "-j"
  38.  
  39. #undef ASM_FILE_START
  40. #undef ASM_GENERATE_INTERNAL_LABEL
  41. #undef ASM_OUTPUT_ADDR_DIFF_ELT
  42. #undef ASM_OUTPUT_ALIGN
  43. #undef ASM_OUTPUT_ASCII
  44. #undef ASM_OUTPUT_DOUBLE
  45. #undef ASM_OUTPUT_INT
  46. #undef ASM_OUTPUT_INTERNAL_LABEL
  47. #undef ASM_OUTPUT_LOCAL
  48. #undef CPP_PREDEFINES
  49. #undef FUNCTION_BOUNDARY
  50. #undef PRINT_OPERAND
  51. #undef PRINT_OPERAND_ADDRESS
  52. #undef TARGET_VERSION
  53.  
  54.  
  55. #define TARGET_DEFAULT 1
  56. #define TARGET_VERSION fprintf (stderr, " (32000, Encore syntax)");
  57. /* Note Encore does not standardly do -Dencore.  */
  58. /* budd: should have a -ns32332 (or -apc) switch! but no harm for now */
  59. #define CPP_PREDEFINES "-Dns32000 -Dn16 -Dns16000 -Dns32332 -Dunix"
  60.  
  61. /* Ignore certain cpp directives used in header files on sysV.  */
  62. #define SCCS_DIRECTIVE
  63.  
  64. /* Output #ident as a .ident.  */
  65. #define ASM_OUTPUT_IDENT(FILE, NAME) fprintf (FILE, "\t.ident \"%s\"\n", NAME);
  66.  
  67. /* The .file command should always begin the output.  */
  68. #define ASM_FILE_START(FILE) sdbout_filename ((FILE), main_input_filename)
  69.  
  70. #define FUNCTION_BOUNDARY 128        /* speed optimization */
  71.  
  72. /*
  73.  *  The Encore assembler uses ".align 2" to align on 2-byte boundaries.
  74.  */
  75.  
  76. #define ASM_OUTPUT_ALIGN(FILE,LOG)                    \
  77.     fprintf (FILE, "\t.align %d\n", 1 << (LOG))
  78.  
  79. /*
  80.  *  Internal labels are prefixed with a period.
  81.  */
  82.  
  83. #define ASM_GENERATE_INTERNAL_LABEL(LABEL,PREFIX,NUM)            \
  84.     sprintf (LABEL, "*.%s%d", PREFIX, NUM)
  85. #define ASM_OUTPUT_INTERNAL_LABEL(FILE,PREFIX,NUM)            \
  86.     fprintf (FILE, ".%s%d:\n", PREFIX, NUM)
  87. #define ASM_OUTPUT_ADDR_DIFF_ELT(FILE, VALUE, REL)            \
  88.     fprintf (FILE, "\t.word .L%d-.LI%d\n", VALUE, REL)
  89.  
  90. /*
  91.  *  Different syntax for integer constants, double constants, and
  92.  *  uninitialized locals.
  93.  */
  94.  
  95. #define ASM_OUTPUT_INT(FILE,VALUE)                \
  96. ( fprintf (FILE, "\t.double "),                    \
  97.   output_addr_const (FILE, (VALUE)),                \
  98.   fprintf (FILE, "\n"))
  99.  
  100. #define ASM_OUTPUT_DOUBLE(FILE,VALUE)                \
  101.  fprintf (FILE, "\t.long 0f%.20e\n", (VALUE))
  102.  
  103. #define ASM_OUTPUT_LOCAL(FILE, NAME, SIZE, ROUNDED)        \
  104. ( fputs ("\t.bss ", (FILE)),                    \
  105.   assemble_name ((FILE), (NAME)),                \
  106.   fprintf ((FILE), ",%d,%d\n", (SIZE), (ROUNDED)))
  107.  
  108.  /*
  109.   *  Encore assembler can't handle huge string constants like the one in
  110.   *  gcc.c.  If the default routine in varasm.c were more conservative, this
  111.   *  code could be eliminated.  It starts a new .ascii directive every 40
  112.   *  characters.
  113.   */
  114.  
  115. #define ASM_OUTPUT_ASCII(file, p, size)            \
  116. {                            \
  117.   for (i = 0; i < size; i++)                \
  118.     {                            \
  119.       register int c = p[i];                \
  120.       if ((i / 40) * 40 == i)                \
  121.       if (i == 0)                    \
  122.         fprintf (file, "\t.ascii \"");            \
  123.       else                        \
  124.         fprintf (file, "\"\n\t.ascii \"");        \
  125.       if (c == '\"' || c == '\\')            \
  126.         putc ('\\', file);                \
  127.       if (c >= ' ' && c < 0177)                \
  128.         putc (c, file);                    \
  129.       else                        \
  130.         {                        \
  131.           fprintf (file, "\\%o", c);            \
  132.           if (i < size - 1                 \
  133.               && p[i + 1] >= '0' && p[i + 1] <= '9')    \
  134.           fprintf (file, "\"\n\t.ascii \"");        \
  135.         }                        \
  136.     }                            \
  137.   fprintf (file, "\"\n");                \
  138. }
  139.  
  140.  /*
  141.   *  Dollar signs are required before immediate operands, double
  142.   *  floating point constants use $0f syntax, and external addresses
  143.   *  should be prefixed with a question mark to avoid assembler warnings
  144.   *  about undefined symbols.
  145.   */
  146.  
  147. #define PRINT_OPERAND(FILE, X, CODE)                    \
  148. { if (CODE == '$') putc ('$', FILE);                    \
  149.   else if (CODE == '?') fputc ('?', FILE);                \
  150.   else if (GET_CODE (X) == REG)                        \
  151.     fprintf (FILE, "%s", reg_names[REGNO (X)]);                \
  152.   else if (GET_CODE (X) == MEM)                        \
  153.     {                                    \
  154.       rtx xfoo;                                \
  155.       xfoo = XEXP (X, 0);                        \
  156.       switch (GET_CODE (xfoo))                        \
  157.     {                                \
  158.     case MEM:                            \
  159.       if (GET_CODE (XEXP (xfoo, 0)) == REG)                \
  160.         if (REGNO (XEXP (xfoo, 0)) == STACK_POINTER_REGNUM)        \
  161.           fprintf (FILE, "0(0(sp))");                \
  162.         else fprintf (FILE, "0(0(%s))",                \
  163.               reg_names[REGNO (XEXP (xfoo, 0))]);        \
  164.       else                                \
  165.         {                                \
  166.           fprintf (FILE, "0(");                    \
  167.           output_address (xfoo);                    \
  168.           putc (')', FILE);                        \
  169.         }                                \
  170.       break;                            \
  171.     case REG:                            \
  172.       fprintf (FILE, "0(%s)", reg_names[REGNO (xfoo)]);        \
  173.       break;                            \
  174.     case PRE_DEC:                            \
  175.     case POST_INC:                            \
  176.       fprintf (FILE, "tos");                    \
  177.       break;                            \
  178.     case CONST_INT:                            \
  179.       fprintf (FILE, "@%d", INTVAL (xfoo));                \
  180.       break;                            \
  181.     default:                            \
  182.       output_address (xfoo);                    \
  183.       break;                            \
  184.     }                                \
  185.     }                                    \
  186.   else if (GET_CODE (X) == CONST_DOUBLE && GET_MODE (X) != DImode)    \
  187.     if (GET_MODE (X) == DFmode)                        \
  188.       { union { double d; int i[2]; } u;                \
  189.     u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X);    \
  190.     fprintf (FILE, "$0f%.20e", u.d); }                \
  191.     else { union { double d; int i[2]; } u;                \
  192.        u.i[0] = CONST_DOUBLE_LOW (X); u.i[1] = CONST_DOUBLE_HIGH (X); \
  193.        fprintf (FILE, "$0f%.20e", u.d); }                \
  194.   else if (GET_CODE (X) == CONST)                    \
  195.     output_addr_const (FILE, X);                    \
  196.   else { putc ('$', FILE); output_addr_const (FILE, X); }}
  197.  
  198. #define PRINT_OPERAND_ADDRESS(FILE, ADDR)  print_operand_address(FILE, ADDR)
  199.